/*
*
* SPDX-License-Identifier: GPL-2.0
*
* Copyright (C) 2011-2018 ARM or its affiliates
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; version 2.
* This program is distributed in the hope that it will be useful, but
* WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
* or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
* for more details.
* You should have received a copy of the GNU General Public License along
* with this program; if not, write to the Free Software Foundation, Inc.,
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
*
*/

#include "acamera_command_api.h"
//#include "acamera_firmware_api.h"
#include "acamera_firmware_settings.h"
// created from 2016-10-19T16:42:58.865Z UTClinear.json

// CALIBRATION_LIGHT_SRC
static uint16_t _calibration_light_src[][2] = {
  { 325, 153 }};

// CALIBRATION_RG_POS
static uint16_t _calibration_rg_pos[] = {198,213,228,242,256,271,286,300,315,329,344,358,373,387,421};

// CALIBRATION_BG_POS
static uint16_t _calibration_bg_pos[] = {117,137,151,165,179,194,208,222,236,256,264,279,293,307,335};

// CALIBRATION_MESH_RGBG_WEIGHT
static uint16_t _calibration_mesh_rgbg_weight[][15] = {
  { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2 },
  { 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 8, 47, 128, 256, 234 },
  { 0, 0, 0, 0, 0, 0, 0, 0, 1, 12, 86, 238, 256, 256, 3 },
  { 0, 0, 0, 0, 0, 0, 0, 1, 12, 80, 256, 256, 244, 54, 0 },
  { 0, 0, 0, 0, 0, 0, 1, 13, 83, 256, 256, 238, 64, 7, 0 },
  { 0, 0, 0, 0, 0, 2, 23, 113, 256, 256, 250, 72, 8, 0, 0 },
  { 0, 0, 0, 0, 3, 30, 147, 256, 256, 256, 81, 11, 1, 0, 0 },
  { 0, 0, 0, 5, 38, 173, 256, 256, 242, 74, 10, 1, 0, 0, 0 },
  { 0, 0, 6, 53, 202, 256, 256, 232, 59, 9, 1, 0, 0, 0, 0 },
  { 0, 1, 40, 256, 256, 256, 114, 21, 2, 0, 0, 0, 0, 0, 0 },
  { 0, 2, 75, 256, 256, 191, 41, 5, 0, 0, 0, 0, 0, 0, 0 },
  { 0, 13, 204, 256, 248, 37, 3, 0, 0, 0, 0, 0, 0, 0, 0 },
  { 0, 33, 256, 256, 71, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
  { 0, 256, 256, 102, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
  { 2, 245, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }};

// CALIBRATION_MESH_LS_WEIGHT
static uint16_t _calibration_mesh_ls_weight[][15] = {
    {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
    {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
    {0, 0, 3, 4, 25, 42, 53, 57, 53, 42, 25, 4, 3, 0, 0},
    {0, 0, 4, 131, 157, 179, 193, 198, 193, 179, 157, 131, 4, 0, 0},
    {0, 0, 25, 157, 188, 214, 232, 238, 232, 214, 188, 157, 25, 0, 0},
    {0, 0, 42, 179, 214, 243, 255, 256, 255, 243, 214, 179, 42, 0, 0},
    {0, 0, 53, 193, 232, 255, 256, 256, 256, 255, 232, 193, 53, 0, 0},
    {0, 0, 57, 198, 238, 256, 256, 256, 256, 256, 238, 198, 57, 0, 0},
    {0, 0, 53, 193, 232, 255, 256, 256, 256, 255, 232, 193, 53, 0, 0},
    {0, 0, 42, 179, 214, 243, 255, 256, 255, 243, 214, 179, 42, 0, 0},
    {0, 0, 25, 157, 188, 214, 232, 238, 232, 214, 188, 157, 25, 0, 0},
    {0, 0, 4, 131, 157, 179, 193, 198, 193, 179, 157, 131, 4, 0, 0},
    {0, 0, 3, 4, 25, 42, 53, 57, 53, 42, 25, 4, 3, 0, 0},
    {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
    {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}};

// CALIBRATION_MESH_COLOR_TEMPERATURE
static uint16_t _calibration_mesh_color_temperature[][15] = {
  { 229, 237, 244, 251, 258, 265, 267, 269, 270, 307, 350, 354, 368, 381, 385 },
  { 221, 228, 236, 243, 250, 257, 264, 266, 268, 270, 303, 343, 358, 371, 385 },
  { 215, 222, 230, 237, 244, 251, 258, 264, 266, 268, 271, 310, 351, 364, 385 },
  { 209, 217, 224, 231, 238, 245, 253, 259, 264, 266, 268, 278, 320, 357, 385 },
  { 203, 211, 218, 225, 232, 239, 247, 254, 261, 264, 266, 268, 287, 327, 385 },
  { 200, 204, 212, 219, 226, 233, 240, 247, 255, 262, 264, 266, 268, 292, 385 },
  { 200, 200, 206, 213, 220, 227, 234, 241, 249, 256, 263, 264, 266, 268, 367 },
  { 199, 200, 200, 207, 214, 221, 229, 236, 243, 250, 257, 263, 264, 266, 360 },
  { 187, 195, 200, 201, 208, 215, 223, 230, 237, 244, 251, 258, 263, 264, 290 },
  { 170, 178, 185, 192, 200, 207, 214, 221, 229, 236, 243, 250, 257, 263, 266 },
  { 163, 171, 179, 186, 193, 204, 211, 218, 225, 232, 240, 246, 254, 261, 265 },
  { 148, 158, 166, 173, 180, 188, 205, 212, 219, 226, 233, 240, 248, 254, 263 },
  { 141, 147, 154, 161, 168, 176, 183, 206, 213, 220, 227, 234, 242, 249, 385 },
  { 133, 139, 146, 152, 156, 164, 172, 179, 186, 214, 222, 228, 236, 243, 260 },
  { 133, 133, 133, 133, 143, 149, 154, 155, 163, 170, 177, 217, 224, 231, 248 }};

// RG, BG, MULT. final wb gain adjuster for a sky scene. devided by CALIBRATION_WB_STRENGTH_MULT in use
static uint16_t _calibration_wb_strength[] = {1000, 1000, 1000};

// lux threshold for sky
static uint16_t _calibration_sky_lux_th[] = {10000};

// 1D rg/bg readout from color_temp
static uint16_t _calibration_ct_rg_pos_calc[] = {214,232,256,330,357,373,401};

// 1D rg/bg readout from color_temp
static uint16_t _calibration_ct_bg_pos_calc[] = {321,297,256,194,166,152,137};

// CALIBRATION_COLOR_TEMP
static uint16_t _calibration_color_temp[] = {133,154,200,263,270,351,385};

// CALIBRATION_CT65POS
static uint16_t _calibration_ct65pos[] = {1};

// CALIBRATION_CT40POS
static uint16_t _calibration_ct40pos[] = {6};

// CALIBRATION_CT30POS
static uint16_t _calibration_ct30pos[] = {5};

// CALIBRATION_EVTOLUX_EV_LUT
static uint32_t _calibration_evtolux_ev_lut[] = {920517, 1202657, 1361821, 1509256, 1598376, 1771050, 1860212, 2029450, 2109462, 2270075, 2388793, 2547362, 2671709, 2823891, 2996541};

// CALIBRATION_EVTOLUX_LUX_LUT
static uint32_t _calibration_evtolux_lux_lut[] = {22160, 11000, 7357, 5052, 3851, 2458, 1987, 1207, 979, 655, 488, 330, 247, 150, 100};

// CALIBRATION_BLACK_LEVEL_R
static uint16_t _calibration_black_level_r[][2] = {
    {0, 240},
    {32, 240},
    {64, 240},
    {96, 240},
    {128, 240},
    {160, 240},
    {192, 240},
    {224, 240},
    {256, 240}};

// CALIBRATION_BLACK_LEVEL_GR
static uint16_t _calibration_black_level_gr[][2] = {
    {0, 240},
    {32, 240},
    {64, 240},
    {96, 240},
    {128, 240},
    {160, 240},
    {192, 240},
    {224, 240},
    {256, 240}};

// CALIBRATION_BLACK_LEVEL_GB
static uint16_t _calibration_black_level_gb[][2] = {
    {0, 240},
    {32, 240},
    {64, 240},
    {96, 240},
    {128, 240},
    {160, 240},
    {192, 240},
    {224, 240},
    {256, 240}};

// CALIBRATION_BLACK_LEVEL_B
static uint16_t _calibration_black_level_b[][2] = {
    {0, 240},
    {32, 240},
    {64, 240},
    {96, 240},
    {128, 240},
    {160, 240},
    {192, 240},
    {224, 240},
    {256, 240}};

// CALIBRATION_STATIC_WB
static uint16_t _calibration_static_wb[] = {464,256,256,459};

// RR RG RB GR GG GB BR BG BB
static uint16_t _calibration_mt_absolute_ls_a_ccm[] = {455,32916,32819,32909,448,32819,38,33197,647};

// RR RG RB GR GG GB BR BG BB
static uint16_t _calibration_mt_absolute_ls_d40_ccm[] = {489,32956,32813,32909,451,32822,31,33038,495};

// RR RG RB GR GG GB BR BG BB
static uint16_t _calibration_mt_absolute_ls_d50_ccm[] = {494,32965,32809,32867,458,32871,14,32957,431};

// CALIBRATION_SHADING_LS_A_R
static uint8_t _calibration_shading_ls_a_r[] = {137,127,119,112,106,101,96,92,89,87,85,83,81,80,79,79,79,80,81,82,83,86,89,92,96,100,105,111,118,127,138,151,133,124,117,110,104,99,95,91,88,85,83,81,80,78,78,77,78,78,79,80,82,84,87,90,94,98,103,109,116,124,135,147,131,122,114,108,102,97,93,89,86,83,81,79,78,77,76,76,76,76,77,78,80,82,85,88,92,96,101,106,113,121,131,143,128,120,112,106,100,95,91,87,84,82,80,78,76,75,74,74,74,75,76,77,79,81,84,87,90,94,99,105,111,119,128,139,126,118,111,104,99,94,90,86,83,80,78,76,75,74,73,73,73,73,75,76,78,80,82,85,89,93,98,103,110,117,127,138,125,117,110,103,98,93,89,85,82,80,77,75,74,73,72,72,72,72,74,75,77,79,81,84,88,92,96,102,109,116,125,136,124,116,108,102,97,93,88,84,81,79,76,74,73,72,71,71,71,71,73,74,76,78,80,83,87,91,96,101,107,115,124,135,123,115,107,101,96,92,87,83,80,78,75,73,72,71,70,69,70,71,72,73,75,77,79,83,86,90,95,100,107,114,123,133,122,113,106,101,95,90,86,82,79,77,74,72,71,70,69,68,69,70,71,72,74,76,79,82,85,89,94,99,105,113,121,132,120,112,105,99,94,89,85,81,78,76,73,71,70,68,68,67,67,68,70,71,73,75,78,81,84,88,93,98,104,111,120,130,118,111,104,98,93,88,84,81,77,75,72,70,69,67,66,66,66,67,68,70,72,74,77,80,83,87,92,97,103,110,119,128,117,110,103,97,92,87,83,80,77,74,72,70,68,66,65,65,65,66,68,70,71,74,76,79,83,87,91,96,102,109,118,127,117,109,103,97,92,87,83,80,77,74,72,69,68,66,65,64,65,66,67,69,71,73,76,79,82,86,91,96,102,109,117,127,117,109,103,97,92,87,83,80,77,74,71,69,68,66,65,64,64,66,67,69,71,73,76,79,82,86,91,96,102,109,117,126,117,110,103,97,92,87,83,80,77,74,72,70,68,66,65,64,65,66,68,69,71,74,76,79,83,87,91,97,102,109,118,127,118,110,104,98,93,88,84,80,77,74,72,70,68,67,65,65,65,66,68,70,72,74,77,80,83,87,92,97,103,110,118,128,119,111,104,99,93,89,85,81,78,75,73,71,69,67,66,66,66,67,68,70,72,75,77,80,84,88,92,98,104,111,119,129,120,112,105,99,94,89,85,81,78,76,73,71,70,68,67,66,67,68,69,71,73,75,78,81,84,88,93,99,104,112,120,130,120,112,105,99,94,90,85,82,79,76,74,72,70,69,68,67,68,68,70,71,73,75,78,81,85,89,94,99,105,112,121,131,121,113,106,100,95,90,86,82,79,77,74,72,71,69,68,68,68,69,70,72,74,76,78,82,85,89,94,100,105,112,122,133,121,113,106,100,95,90,86,83,79,77,75,73,71,70,69,69,69,70,71,72,74,76,79,82,86,90,95,100,106,113,124,137,121,114,106,100,95,91,87,83,80,77,75,74,72,71,70,69,70,70,71,73,74,77,79,83,86,90,95,101,107,114,126,141,123,115,108,101,96,92,88,84,81,79,76,75,73,72,71,71,71,71,72,74,76,78,80,83,87,92,96,102,108,115,127,141,125,117,109,103,98,93,89,85,82,80,78,76,74,73,72,72,72,73,74,75,77,79,82,85,88,93,98,103,110,118,127,139,127,119,111,105,100,95,91,87,84,81,79,78,76,75,74,74,74,74,75,77,78,80,83,86,90,95,100,105,113,120,129,140,130,121,113,107,101,96,92,89,86,83,81,79,78,76,76,75,75,76,77,78,80,82,85,88,92,96,102,107,115,123,133,144,132,124,116,109,103,99,94,91,88,85,83,81,79,78,77,77,77,78,79,80,82,84,87,90,94,98,104,110,117,125,136,150,135,126,119,111,106,101,97,93,89,87,84,83,81,80,79,79,79,80,80,82,84,86,89,92,96,101,106,112,120,128,141,156,138,129,121,114,108,103,98,94,91,88,86,84,83,82,81,81,81,81,82,84,85,88,91,94,98,103,108,114,122,131,146,164,141,131,123,116,110,105,100,96,93,90,88,86,85,83,83,83,82,83,84,85,87,90,93,96,100,105,110,117,125,135,152,172,145,135,126,118,112,107,102,98,95,92,90,88,86,85,85,84,84,85,86,87,89,92,95,98,102,107,113,120,128,139,159,184,150,139,129,121,115,109,104,100,97,94,92,90,88,87,86,86,86,86,88,89,91,94,97,100,105,110,116,123,131,143,164,195};

// CALIBRATION_SHADING_LS_A_G
static uint8_t _calibration_shading_ls_a_g[] = {125,117,110,105,100,96,92,89,86,85,83,81,79,78,78,78,78,78,79,80,82,84,86,89,92,96,100,105,111,117,126,137,122,115,108,103,98,94,90,87,85,83,81,79,78,77,76,76,76,77,77,79,80,82,85,87,90,94,98,103,109,115,124,133,120,113,106,101,97,92,89,86,83,81,79,77,76,75,75,74,74,75,76,77,79,81,83,86,89,92,96,101,106,113,121,130,118,111,105,100,95,91,87,84,82,79,78,76,75,74,73,73,73,74,74,76,77,79,82,84,87,91,95,100,105,111,119,128,117,110,104,99,94,90,86,83,81,78,76,75,74,73,72,72,72,73,73,75,76,78,81,83,86,90,94,98,104,110,117,126,116,109,103,98,93,90,86,82,80,78,76,74,73,72,71,71,71,72,73,74,76,77,80,82,85,89,93,97,103,109,116,125,115,108,102,97,93,89,85,82,79,77,75,73,72,71,70,70,70,71,72,73,75,77,79,82,85,88,92,97,102,108,115,124,114,107,101,96,92,88,84,81,78,76,74,72,71,70,69,69,69,70,71,72,74,76,78,81,84,87,91,96,101,107,115,123,113,106,101,96,91,87,83,80,78,75,73,72,70,69,68,68,68,69,70,72,73,75,78,80,83,87,90,95,100,106,114,122,111,105,100,95,90,86,83,79,77,74,72,71,69,68,67,67,67,68,69,71,72,74,77,79,83,86,90,94,99,105,112,121,110,104,99,94,89,85,82,79,76,74,72,70,68,67,66,66,66,67,68,70,72,74,76,79,82,85,89,93,98,104,111,119,109,103,98,93,88,84,81,78,75,73,71,69,67,66,65,65,65,66,67,69,71,73,75,78,81,84,88,93,97,103,110,118,109,103,98,93,88,84,81,78,75,73,71,69,67,66,65,64,64,66,67,69,71,73,75,78,81,84,88,93,97,103,110,117,109,103,98,93,88,84,81,78,75,73,71,69,67,66,64,64,64,66,67,69,70,73,75,78,81,84,88,93,97,103,110,117,110,104,98,93,89,85,81,78,75,73,71,69,67,66,65,64,65,66,68,69,71,73,75,78,81,85,89,93,98,104,110,118,111,104,99,94,89,85,82,79,76,74,72,70,68,66,65,65,65,66,68,70,71,73,76,79,82,85,89,94,99,104,111,119,112,105,99,94,90,86,82,79,77,74,72,70,69,67,66,66,66,67,69,70,72,74,77,79,82,86,90,94,99,105,112,119,112,105,100,95,90,86,83,80,77,75,73,71,69,68,67,66,67,68,69,71,73,75,77,80,83,87,90,95,100,106,112,120,112,106,100,95,91,87,83,80,77,75,73,71,70,68,68,67,68,68,70,71,73,75,77,80,83,87,91,96,100,106,113,121,113,106,100,95,91,87,83,80,78,75,73,72,70,69,68,68,68,69,70,71,73,75,78,80,84,87,91,96,100,106,114,123,112,106,100,95,91,87,84,80,78,76,74,72,70,69,69,68,69,69,70,72,73,76,78,81,84,87,92,96,101,106,115,126,113,106,101,96,91,87,84,81,78,76,74,73,71,70,69,69,69,70,71,72,74,76,78,81,84,88,92,96,101,107,118,129,114,107,101,97,92,88,85,82,79,77,75,74,72,71,70,70,70,71,72,73,75,77,79,82,85,89,93,97,103,108,119,129,116,109,103,98,93,89,86,83,80,78,76,75,73,72,72,71,72,72,73,74,76,78,80,83,86,90,94,99,105,110,118,127,118,111,105,99,95,91,87,84,81,79,77,76,75,74,73,73,73,73,74,75,77,79,81,84,87,92,95,100,107,113,119,127,120,113,106,101,97,92,89,86,83,81,79,77,76,75,74,74,74,75,76,77,78,80,83,86,89,93,97,102,108,114,122,131,122,115,108,103,98,94,90,87,85,82,80,79,78,77,76,76,76,76,77,79,80,82,84,88,91,94,99,104,110,116,126,136,125,117,110,105,100,96,92,89,86,84,82,81,79,78,78,77,78,78,79,80,82,84,86,89,93,96,101,106,112,119,129,142,127,119,112,106,101,97,94,90,88,85,83,82,81,80,79,79,79,79,80,82,83,85,88,91,94,98,102,107,113,121,133,148,129,121,114,108,103,99,95,92,89,87,85,83,82,81,81,80,80,81,82,83,85,87,89,92,95,100,104,109,116,124,138,155,132,124,116,110,105,100,97,94,91,88,86,85,83,83,82,82,82,82,83,85,86,88,91,94,97,102,106,112,118,128,145,165,135,126,118,112,107,102,98,95,92,90,88,86,85,84,83,83,83,84,85,86,88,90,93,96,99,104,109,114,120,131,148,175};

// CALIBRATION_SHADING_LS_A_B
static uint8_t _calibration_shading_ls_a_b[] = {122,115,108,103,99,94,91,88,86,85,83,81,80,79,78,78,78,79,79,80,82,84,87,90,92,96,100,104,110,117,125,133,119,113,106,101,97,93,89,86,84,82,81,79,78,77,77,76,76,77,78,79,80,82,85,88,90,94,98,102,108,114,122,130,116,110,104,99,95,91,87,85,83,80,79,77,76,75,75,74,75,75,76,77,79,80,83,86,88,92,95,100,105,111,119,127,115,109,103,98,93,90,86,83,81,79,77,76,74,74,73,73,73,74,75,76,77,79,81,84,87,90,94,98,104,110,117,124,113,107,102,97,92,88,85,83,80,78,76,75,74,73,72,72,72,73,73,75,76,78,80,83,86,90,93,97,102,109,115,123,112,106,101,96,92,88,84,82,79,77,75,74,73,72,71,71,71,72,73,74,75,77,79,82,85,88,92,97,102,108,115,123,112,106,101,96,91,88,84,81,78,76,74,73,72,71,70,70,70,71,72,73,75,77,79,81,84,87,91,96,101,107,114,122,111,105,100,95,91,87,83,80,78,76,74,72,71,70,69,69,70,70,71,72,74,76,78,81,83,87,90,95,100,106,113,121,111,105,99,94,89,86,82,79,77,75,73,71,70,69,68,68,68,69,70,71,73,75,77,80,83,86,90,94,99,105,112,120,110,104,98,93,89,85,82,79,76,74,72,70,69,68,67,67,67,68,69,70,72,74,76,79,82,85,89,93,98,104,111,119,108,103,97,92,88,84,81,78,75,73,71,69,68,67,66,66,66,67,68,70,71,73,76,78,81,84,88,92,97,103,109,117,107,101,96,91,87,83,80,77,75,73,70,69,67,66,65,65,65,66,67,69,71,73,75,77,80,84,87,91,96,102,108,116,107,101,96,91,87,83,80,77,74,72,70,68,67,65,64,64,65,66,67,69,70,72,75,77,80,83,87,92,96,101,108,115,107,101,96,91,87,83,80,77,75,73,70,68,67,66,64,64,64,65,67,69,70,73,75,77,80,83,87,92,96,101,108,115,108,102,97,92,87,84,80,77,75,73,71,69,67,66,65,65,65,66,67,69,71,73,75,78,81,84,88,92,97,102,108,116,108,103,97,93,88,84,81,78,76,73,71,69,68,66,65,65,65,66,68,70,71,73,76,78,81,85,88,93,97,103,109,116,109,103,98,93,89,85,81,79,76,74,72,70,68,67,66,66,66,67,69,70,72,74,76,79,82,86,89,93,98,104,110,117,110,104,98,94,89,85,82,79,76,74,72,70,69,68,67,66,67,68,69,71,73,74,77,79,83,86,89,94,99,105,111,118,110,104,99,94,89,86,82,79,77,75,73,71,70,68,67,67,68,68,70,71,73,75,77,80,83,86,90,94,99,105,111,119,111,104,99,94,89,86,83,79,77,75,73,71,70,69,68,68,68,69,70,71,73,75,77,80,83,87,91,95,99,105,112,121,110,104,99,94,89,86,83,80,77,75,73,72,70,69,69,68,68,69,70,72,73,75,78,80,83,87,91,95,99,105,114,124,110,104,99,94,90,86,83,80,77,75,74,72,71,70,69,69,69,70,71,72,73,76,78,81,84,87,91,95,100,106,115,126,111,105,99,95,90,87,84,81,78,76,74,73,72,71,70,70,70,71,72,73,74,77,79,81,84,88,91,96,101,107,116,126,113,106,101,96,92,88,85,82,80,77,76,74,73,72,72,71,71,72,73,74,75,77,80,83,85,89,93,97,103,109,115,124,115,108,102,97,94,90,87,83,81,79,77,76,75,74,73,73,73,74,74,75,77,79,81,84,87,91,94,99,105,111,117,124,117,110,104,99,95,91,88,85,82,80,79,77,76,75,74,74,75,75,76,77,79,81,83,85,89,92,96,101,107,112,120,128,119,112,106,101,97,93,89,86,84,82,80,79,78,77,76,76,76,76,77,79,80,82,84,87,90,94,98,103,108,114,122,132,121,114,108,103,99,94,91,88,86,83,81,80,79,78,78,78,78,78,79,80,82,84,86,89,92,96,100,105,110,116,126,137,123,116,110,105,100,96,93,90,87,85,83,82,81,80,79,79,79,79,80,82,83,85,87,90,93,97,101,106,111,119,129,142,125,118,111,106,101,97,94,91,88,86,84,83,82,81,80,81,80,81,81,83,84,86,89,92,95,99,103,108,113,121,134,149,127,120,113,108,103,99,95,92,90,87,86,84,83,82,82,82,81,82,83,84,86,88,90,93,96,100,105,110,115,124,140,158,129,122,116,109,105,100,97,94,91,89,87,85,84,83,83,83,82,83,84,85,87,89,92,95,98,102,107,112,117,126,143,167};

// CALIBRATION_SHADING_LS_TL84_R
static uint8_t _calibration_shading_ls_tl84_r[] = {126,118,111,106,101,96,92,89,87,85,83,81,79,78,78,78,78,78,79,80,81,83,86,89,92,95,100,105,111,117,127,139,123,116,110,104,99,95,91,88,86,83,82,80,78,77,77,76,76,77,78,79,80,82,84,87,90,94,98,103,109,115,125,135,121,114,108,102,98,94,90,87,84,82,80,78,77,76,75,75,75,75,76,77,79,80,83,86,89,92,96,101,107,114,122,131,119,112,106,101,96,92,88,85,82,80,79,77,76,75,74,74,74,74,75,76,77,79,82,84,87,91,95,100,105,112,119,129,118,111,105,99,95,91,87,84,81,79,77,76,75,73,73,72,72,73,74,75,76,78,80,83,86,90,94,98,104,110,118,126,116,110,104,98,94,90,86,83,80,78,76,75,73,72,71,71,71,71,73,74,75,77,79,82,85,88,93,97,103,109,116,125,115,108,102,97,92,89,85,82,79,77,75,73,72,71,70,70,70,70,72,73,74,76,78,81,84,88,91,96,102,108,115,124,114,107,101,96,91,88,84,81,78,76,74,72,71,70,69,69,69,70,70,72,73,75,77,80,83,87,91,95,100,107,114,122,113,106,100,95,91,87,83,80,78,75,73,72,70,69,68,68,68,69,70,71,72,74,77,79,82,86,90,94,100,106,113,121,112,105,99,94,90,86,83,79,77,75,73,71,69,68,67,67,67,68,69,70,72,74,76,79,81,85,89,93,99,105,112,120,111,105,99,94,89,85,82,79,76,74,72,70,69,67,66,66,66,67,68,70,71,73,75,78,81,84,88,93,98,104,111,119,110,104,98,93,89,85,81,78,76,74,72,70,68,67,65,65,65,66,68,69,71,73,75,77,80,84,88,92,97,103,110,119,110,104,98,93,89,85,81,78,76,73,71,69,68,66,65,64,65,66,67,69,70,72,75,77,80,83,87,92,97,103,110,118,110,104,98,93,88,84,81,78,75,73,71,69,67,66,65,64,64,65,67,69,70,72,75,77,80,83,87,92,97,103,110,118,110,103,98,93,88,84,81,78,75,73,71,69,67,66,64,64,64,65,67,69,70,72,74,77,80,83,87,92,97,103,110,118,110,104,98,93,88,84,81,78,75,73,71,69,67,66,65,64,64,66,67,69,70,72,74,77,80,83,87,92,97,103,110,118,110,104,98,93,89,85,81,78,76,73,71,69,68,66,65,65,65,66,67,69,71,72,75,77,80,84,88,92,97,103,110,118,111,104,98,93,89,85,82,78,76,73,72,70,68,67,66,65,66,67,68,69,71,73,75,78,80,84,88,93,98,104,110,119,111,105,99,94,90,85,82,79,76,74,72,70,69,67,67,66,66,67,68,70,72,73,75,78,81,85,89,93,98,105,112,120,112,105,99,94,90,86,83,80,77,75,73,71,70,68,67,67,67,68,69,70,72,74,76,79,82,85,89,94,99,105,112,122,112,106,100,95,91,87,83,80,78,75,73,72,70,69,68,68,68,69,70,71,73,75,77,79,82,86,90,95,100,106,115,126,113,107,101,96,91,88,84,81,79,76,74,72,71,70,69,69,69,70,71,72,74,76,78,80,83,87,91,96,101,107,118,130,114,108,102,97,93,89,85,82,79,77,75,74,72,71,71,70,70,71,72,73,74,76,79,81,84,88,92,97,103,108,119,130,116,109,103,98,94,90,86,83,81,78,76,75,74,72,72,71,72,72,73,74,76,77,80,82,85,89,93,98,104,111,118,128,118,111,105,100,95,91,88,84,82,79,78,76,75,74,73,73,73,73,74,76,77,79,81,84,87,91,95,100,106,113,120,128,120,113,106,101,96,92,89,86,83,81,79,77,76,75,74,74,74,75,75,76,78,80,82,85,88,92,96,101,108,114,122,131,122,115,108,103,98,94,90,87,85,82,80,78,77,76,76,75,76,76,77,78,79,81,83,86,90,93,98,103,109,116,125,136,124,116,110,104,100,96,92,89,86,84,82,80,79,78,77,77,77,77,78,80,81,83,85,88,92,95,100,105,111,118,129,141,127,119,112,106,102,97,94,90,88,85,83,82,80,80,79,79,78,79,80,81,83,84,87,89,93,97,102,107,113,121,133,148,129,121,115,108,103,100,95,92,89,87,85,83,82,81,80,81,80,81,81,83,84,86,89,92,95,99,104,109,115,124,138,155,133,125,117,111,106,101,98,94,91,89,87,85,84,83,82,82,82,83,83,85,86,89,91,94,97,101,107,112,119,128,146,167,137,128,120,114,108,103,100,96,93,91,88,87,86,85,84,84,84,84,85,87,89,90,93,96,99,104,109,115,121,132,151,179};

// CALIBRATION_SHADING_LS_TL84_G
static uint8_t _calibration_shading_ls_tl84_g[] = {122,115,108,103,99,95,91,88,85,84,82,80,79,78,77,77,77,77,78,79,81,83,85,88,91,94,98,103,109,115,123,134,120,113,107,102,97,93,90,87,84,82,81,79,77,76,76,76,76,76,77,78,79,81,84,86,89,93,97,102,107,113,122,131,119,111,105,100,96,92,88,85,83,81,79,77,76,75,75,74,74,75,76,77,78,80,82,85,88,92,95,100,105,111,119,128,117,110,104,99,94,91,87,84,82,79,78,76,75,74,73,73,73,73,74,75,77,79,81,84,87,90,94,99,104,110,117,126,115,108,103,98,93,89,86,83,80,78,76,75,74,73,72,72,72,72,73,74,76,78,80,82,85,89,93,97,102,109,116,124,114,107,101,96,92,88,85,82,79,77,75,74,73,72,71,71,71,71,72,73,75,77,79,81,84,88,92,96,101,107,114,122,113,106,100,95,91,88,84,81,78,76,74,73,71,70,70,69,70,70,71,72,74,76,78,80,83,87,90,95,100,106,113,121,111,105,99,95,90,87,83,80,77,75,73,72,70,69,69,68,69,69,70,71,73,75,77,80,83,86,90,94,99,105,112,120,110,104,99,94,89,86,82,79,77,75,73,71,70,69,68,68,68,68,69,71,72,74,76,79,82,85,89,93,98,104,111,119,110,103,98,93,89,85,82,79,76,74,72,70,69,68,67,67,67,68,69,70,72,74,76,78,81,84,88,92,97,103,110,118,109,103,97,93,88,85,81,78,76,73,72,70,68,67,66,66,66,67,68,69,71,73,75,78,81,84,88,92,97,103,109,117,109,102,97,92,88,84,81,78,75,73,71,69,68,66,65,65,65,66,68,69,71,73,75,77,80,84,87,92,96,102,109,116,108,102,97,92,88,84,81,78,75,73,71,69,67,66,65,64,65,66,67,69,71,73,75,77,80,83,87,92,96,102,108,116,108,102,97,92,88,84,80,77,75,73,71,69,67,66,64,64,64,66,67,69,70,72,75,77,80,83,87,92,96,102,108,116,108,102,97,92,87,84,80,78,75,73,71,69,67,66,64,64,64,65,67,69,70,72,75,77,80,83,87,91,96,102,108,116,108,102,97,92,87,84,81,78,75,73,71,69,67,66,65,64,65,66,67,69,70,72,75,77,80,83,87,91,96,102,109,116,108,102,97,92,88,84,81,78,75,73,71,69,67,66,65,65,65,66,67,69,71,72,75,77,80,84,87,92,97,102,109,116,109,103,97,92,88,84,81,78,76,73,71,70,68,67,66,65,66,67,68,70,71,73,75,78,81,84,88,92,97,103,109,116,109,103,98,93,89,85,82,79,76,74,72,70,69,67,67,66,67,67,69,70,72,74,76,78,81,85,88,93,98,104,110,118,110,104,98,93,89,86,82,79,77,74,72,71,69,68,67,67,67,68,69,71,72,74,76,79,82,85,89,94,98,104,111,120,111,104,99,94,90,86,83,80,77,75,73,71,70,69,68,68,68,69,70,71,73,75,77,80,83,86,90,94,99,105,114,124,112,105,100,95,91,87,84,81,78,76,74,72,71,70,69,69,69,70,71,72,74,76,78,80,84,87,91,95,100,106,116,128,113,107,101,96,92,88,85,82,79,77,75,74,72,71,70,70,70,71,72,73,75,77,79,81,84,88,92,96,102,107,117,128,114,108,102,97,93,89,86,83,80,78,76,75,73,72,72,71,71,72,73,74,76,77,80,82,85,89,93,98,103,109,116,126,116,109,104,98,94,90,87,84,81,79,77,76,75,73,73,73,73,73,74,75,77,79,81,84,87,91,94,99,105,111,117,126,118,111,105,100,95,91,88,85,82,80,78,77,76,75,74,74,74,74,75,76,78,80,82,85,88,92,95,100,106,112,120,129,120,113,106,101,97,93,89,86,84,81,79,78,77,76,75,75,75,76,77,78,79,81,83,86,90,93,97,102,108,114,123,133,122,115,109,103,98,94,91,88,85,83,81,79,78,77,77,76,77,77,78,79,81,83,85,88,91,95,99,104,109,116,126,138,124,117,110,105,100,96,93,90,87,84,82,81,80,79,78,78,78,79,80,81,82,84,87,89,93,97,101,106,111,118,130,144,127,119,113,107,102,98,95,91,89,86,84,83,81,81,80,80,80,80,81,83,84,86,88,91,94,98,103,108,114,122,135,151,130,122,115,109,104,100,96,93,90,88,86,85,83,82,82,82,82,82,83,84,86,88,90,93,97,101,105,110,117,126,142,161,133,125,117,112,106,102,98,95,92,90,88,86,85,84,84,83,84,84,85,86,88,90,92,95,99,103,108,113,119,129,146,171};

// CALIBRATION_SHADING_LS_TL84_B
static uint8_t _calibration_shading_ls_tl84_b[] = {118,112,106,101,96,93,89,87,85,83,82,80,78,77,77,76,76,77,78,79,80,82,84,87,90,94,97,101,106,112,120,129,116,110,105,100,95,91,88,85,83,81,80,78,77,76,75,75,75,75,77,78,79,81,83,85,89,92,95,100,104,111,118,127,114,108,103,98,94,90,87,84,82,80,78,76,75,74,74,74,74,74,75,76,78,79,82,84,87,90,94,98,103,109,116,124,112,107,101,97,92,88,85,83,81,78,77,75,74,73,73,73,72,73,74,75,76,78,80,83,86,89,92,96,102,107,114,122,111,105,100,95,91,87,84,81,79,77,75,74,73,72,72,71,71,72,72,74,75,77,79,82,85,88,91,95,100,106,113,120,110,104,99,94,90,87,83,80,78,76,74,73,72,71,70,70,70,71,72,73,74,76,78,80,83,86,90,94,99,105,111,119,109,103,98,93,89,86,82,80,77,75,73,72,71,70,69,69,69,70,71,72,73,75,77,79,82,86,89,93,98,104,110,117,108,102,97,92,88,85,81,79,76,74,73,71,70,69,68,68,68,69,70,71,72,74,76,79,82,84,88,92,97,102,109,117,108,102,96,91,87,83,81,78,76,74,72,70,69,68,67,67,67,68,69,70,72,73,76,78,80,84,88,91,96,102,108,116,107,101,95,91,87,83,80,77,75,73,71,70,68,67,66,66,67,67,68,69,71,73,75,77,80,83,87,91,95,101,108,116,106,100,95,90,86,83,80,77,75,73,70,69,68,66,66,66,66,66,68,69,71,72,74,77,79,83,86,90,95,101,107,114,106,100,95,90,86,82,79,77,74,72,70,69,67,66,65,65,65,66,67,69,70,72,74,77,79,82,86,90,95,100,107,114,106,100,94,90,86,82,79,76,74,72,70,69,67,66,64,64,65,66,67,69,70,72,74,77,79,82,86,90,94,100,106,113,106,100,94,90,86,82,79,76,74,72,70,68,67,66,64,64,64,65,67,69,70,72,74,76,79,82,86,90,94,99,106,113,106,100,94,90,86,82,79,76,74,72,70,68,67,65,64,64,64,65,67,68,70,72,74,76,79,82,85,90,94,100,106,113,105,99,94,90,86,82,79,77,74,72,70,68,67,66,64,64,64,65,67,68,70,72,74,77,79,82,86,90,94,100,106,113,105,100,94,90,86,83,79,77,74,72,70,69,67,66,65,64,65,65,67,69,70,72,74,76,80,82,86,90,95,100,106,113,105,100,95,91,86,83,80,77,75,72,71,69,67,66,66,65,65,66,67,69,71,72,74,77,80,83,86,90,95,101,107,113,106,100,95,91,87,83,80,77,75,73,71,70,68,67,66,66,66,67,68,69,71,73,75,77,80,83,87,91,95,101,107,115,107,101,96,91,87,84,81,78,75,73,72,70,69,68,67,67,67,68,69,70,72,73,75,78,81,84,88,92,96,102,109,117,108,102,97,92,88,85,81,79,76,74,72,71,69,69,68,68,68,68,69,71,73,74,77,79,82,85,88,93,97,102,111,121,109,103,97,92,89,85,82,79,77,75,73,72,70,69,69,69,69,69,71,72,73,75,77,79,83,86,89,94,98,103,113,124,110,104,99,94,90,86,83,80,78,76,74,73,72,70,70,69,70,70,71,72,74,76,78,81,83,86,90,94,100,105,115,125,111,105,100,95,91,87,84,81,79,77,75,74,73,72,71,71,71,72,72,73,75,77,79,81,84,88,91,96,101,107,113,122,113,107,100,96,92,88,85,82,80,78,76,75,74,73,72,72,72,73,74,75,76,78,80,83,86,89,93,97,103,109,114,121,115,108,102,97,93,90,86,84,81,79,77,76,75,74,73,73,73,74,75,75,77,79,81,84,87,90,94,98,104,110,117,124,116,110,104,99,94,91,88,85,82,80,79,77,76,75,75,75,75,75,76,77,79,81,82,85,88,92,96,100,106,111,119,127,118,111,105,100,96,92,89,86,84,82,80,79,77,76,76,76,76,76,77,79,80,82,84,86,90,93,98,101,107,113,122,132,120,113,107,102,98,94,91,88,86,83,82,80,79,78,78,78,78,78,79,80,82,83,86,88,91,95,99,103,109,116,126,138,122,115,109,104,100,96,92,90,87,85,83,82,80,80,79,80,79,80,81,82,83,85,87,90,93,96,101,105,111,117,130,144,125,118,112,106,102,98,94,92,89,86,85,83,82,81,81,81,81,81,82,83,85,87,89,91,95,99,103,108,113,121,136,153,128,120,114,108,103,99,96,93,90,88,86,85,84,82,83,82,82,83,84,85,86,88,90,93,96,101,105,111,115,124,138,160};

// CALIBRATION_SHADING_LS_D65_R
static uint8_t _calibration_shading_ls_d65_r[] = {133,124,117,110,105,100,95,92,89,86,84,82,80,79,79,78,78,79,79,81,82,84,87,90,94,98,102,108,114,122,132,145,130,122,114,108,103,98,94,90,87,85,83,81,79,78,77,77,77,77,78,79,81,83,85,88,92,96,101,106,112,120,130,141,128,120,112,106,101,96,92,88,85,83,81,79,77,76,76,75,75,76,77,78,79,81,84,87,90,94,98,104,110,117,126,137,125,118,111,104,99,95,90,87,84,81,79,78,76,75,74,74,74,74,75,76,78,80,82,85,89,92,97,102,108,115,124,134,124,116,109,103,98,93,89,86,83,80,78,76,75,74,73,73,73,73,74,75,77,78,81,84,87,91,95,101,107,114,122,132,122,114,108,101,96,92,88,84,81,79,77,75,74,72,72,71,71,72,73,74,76,78,80,83,86,90,94,99,105,112,120,130,121,113,106,100,95,91,87,83,80,78,76,74,72,71,70,70,70,71,72,73,75,76,79,82,85,89,93,98,104,111,119,128,119,112,105,99,94,90,86,82,79,77,75,73,71,70,69,69,69,70,71,72,74,76,78,81,84,88,92,97,103,109,118,127,118,110,104,98,93,89,85,81,78,76,74,72,70,69,68,68,68,69,70,71,73,75,77,80,83,87,91,96,102,108,116,125,117,110,103,97,92,88,84,80,78,75,73,71,69,68,67,67,67,68,69,70,72,74,76,79,82,86,90,95,101,107,115,124,117,109,102,97,92,87,83,80,77,75,72,70,69,67,66,66,66,67,68,69,71,73,76,78,82,85,89,94,100,106,114,123,116,108,102,96,91,87,83,80,77,74,72,70,68,66,65,65,65,66,68,69,71,73,75,78,81,85,89,94,99,106,114,123,115,108,102,96,91,86,83,79,76,74,72,70,68,66,65,64,65,66,67,69,70,73,75,78,81,85,89,94,99,106,114,123,115,108,101,95,91,86,83,79,76,74,71,70,68,66,65,64,64,65,67,69,70,72,75,78,81,84,88,94,99,106,113,122,115,107,101,96,91,86,82,79,76,74,71,69,67,66,65,64,64,65,67,69,70,73,75,78,81,84,88,93,99,105,113,122,115,108,101,96,91,86,83,79,76,74,71,69,68,66,65,64,64,66,67,69,70,73,75,78,81,85,89,93,99,106,113,122,115,108,101,96,91,87,83,79,77,74,72,70,68,66,65,65,65,66,67,69,71,73,75,78,81,85,89,93,99,106,114,123,116,108,102,96,92,87,83,80,77,74,72,70,68,67,66,65,66,66,68,69,71,73,75,78,81,85,89,94,100,107,115,124,117,109,102,97,92,88,84,80,77,75,73,71,69,68,67,66,67,67,68,70,72,74,76,79,82,86,90,95,101,108,116,125,117,110,103,97,93,88,84,81,78,75,73,71,70,68,67,67,67,68,69,70,72,74,77,79,83,86,91,96,101,108,117,127,118,111,104,98,93,89,85,82,79,76,74,72,71,69,69,68,68,69,70,71,73,75,77,80,83,87,92,97,103,109,120,132,119,112,105,99,94,90,86,83,80,77,75,73,72,70,70,69,69,70,71,72,74,76,78,81,84,88,93,98,104,111,123,136,121,113,106,100,95,91,87,84,81,78,76,74,73,71,71,70,70,71,72,73,75,77,79,82,86,89,94,99,105,112,124,137,122,115,108,102,97,92,88,85,82,80,77,75,74,73,72,72,72,72,73,75,76,78,81,83,87,91,95,101,107,114,123,134,124,116,110,103,98,94,90,86,83,81,78,77,76,74,73,73,73,74,75,76,77,79,82,85,88,92,97,102,109,116,124,135,126,118,111,105,100,95,91,88,85,82,80,78,77,76,75,75,75,75,76,77,79,81,83,86,90,94,98,104,111,118,127,138,129,120,113,107,102,97,93,89,86,84,81,80,78,77,76,76,76,77,77,79,80,82,85,88,91,95,100,106,112,120,130,142,131,123,115,109,103,98,94,91,88,85,83,81,80,79,78,78,78,78,79,80,82,84,86,89,93,97,102,108,114,122,134,148,134,125,117,111,105,100,96,93,89,87,85,83,82,81,80,80,80,80,81,82,84,86,88,91,95,99,104,110,117,125,138,154,138,128,120,113,108,103,99,95,91,89,87,85,84,82,82,81,81,82,83,84,85,88,90,93,97,101,107,113,120,129,144,161,141,131,123,116,110,105,101,97,94,91,89,87,85,84,84,83,83,84,85,86,88,90,92,96,100,104,110,116,123,134,151,173,145,135,126,119,112,107,103,99,96,93,91,89,87,86,85,85,85,85,87,88,90,92,95,98,102,107,112,118,126,137,156,184};

// CALIBRATION_SHADING_LS_D65_G
static uint8_t _calibration_shading_ls_d65_g[] = {123,115,109,104,99,95,91,88,85,84,82,80,78,77,77,77,77,77,78,79,80,82,85,88,91,95,98,103,109,115,124,134,121,114,107,102,98,93,90,87,84,82,81,78,77,76,76,75,76,76,77,78,79,81,84,86,89,93,97,102,107,113,122,131,119,112,106,100,96,92,88,86,83,81,79,77,76,75,75,74,74,75,75,77,78,80,82,85,88,91,95,100,105,112,119,128,117,110,104,99,95,91,87,84,82,79,78,76,75,74,73,73,73,73,74,75,77,79,81,84,87,90,94,99,104,110,117,126,115,109,103,98,93,89,86,83,80,78,76,75,74,73,72,72,72,72,73,74,76,78,80,83,85,89,93,97,103,108,116,124,114,107,102,97,92,89,85,82,79,77,75,74,73,72,71,71,71,71,72,73,75,77,79,81,84,88,92,96,101,107,114,122,113,106,101,96,91,88,84,81,78,76,74,73,71,70,70,69,70,70,71,72,74,76,78,80,83,87,91,95,100,106,113,121,112,106,100,95,90,87,83,80,78,75,73,72,70,69,69,68,69,69,70,72,73,75,77,80,83,86,90,94,99,105,112,120,111,105,99,94,90,86,82,79,77,75,73,71,70,69,68,67,68,69,69,71,72,74,76,79,82,85,89,93,98,104,111,119,110,104,98,93,89,85,82,79,76,74,72,70,69,68,67,67,67,68,69,70,72,74,76,78,81,84,88,92,97,103,110,118,109,103,98,93,89,85,81,78,76,74,72,70,68,67,66,66,66,67,68,70,71,73,75,78,81,84,88,92,97,103,109,117,109,103,97,92,88,84,81,78,75,73,71,69,68,66,65,65,65,66,68,69,71,73,75,77,80,84,87,92,96,102,109,116,109,103,97,92,88,84,81,78,75,73,71,69,67,66,65,64,65,66,67,69,71,73,75,77,80,83,87,92,96,102,109,116,108,102,97,92,88,84,81,78,75,73,71,69,67,66,65,64,64,66,67,69,70,72,75,77,80,83,87,91,96,102,109,116,108,102,97,92,88,84,81,78,75,73,71,69,67,66,64,64,64,66,67,69,70,72,75,77,80,83,87,91,96,102,109,116,109,103,97,92,88,84,81,78,75,73,71,69,67,66,65,64,65,66,67,69,70,72,75,77,80,83,87,91,96,102,109,116,109,103,97,92,88,84,81,78,75,73,71,69,68,66,65,65,65,66,67,69,71,73,75,77,80,84,87,92,97,103,109,116,109,103,98,93,89,85,81,78,76,73,72,70,68,67,66,65,66,67,68,70,71,73,75,78,81,84,88,92,97,103,110,117,110,104,98,93,89,85,82,79,76,74,72,70,69,67,67,66,67,67,68,70,72,74,76,78,81,85,88,93,98,104,111,118,110,104,99,94,89,86,82,79,77,74,72,71,69,68,67,67,67,68,69,71,72,74,76,79,82,85,89,94,98,104,112,121,111,105,99,94,90,86,83,80,77,75,73,72,70,69,68,68,68,69,70,71,73,75,77,80,83,86,90,94,99,105,114,125,112,106,100,95,91,87,84,81,78,76,74,72,71,70,69,69,69,70,71,72,74,76,78,80,83,87,91,95,100,106,117,129,113,107,101,96,92,88,85,82,79,77,75,74,72,71,70,70,70,71,72,73,75,77,79,81,84,88,92,96,102,108,118,129,115,108,102,97,93,89,86,83,80,78,76,75,73,72,71,71,71,72,73,74,76,77,80,82,85,89,93,97,104,110,117,127,117,110,104,99,94,90,87,84,81,79,77,76,75,73,73,73,73,73,74,75,77,78,81,83,86,90,94,99,105,111,118,127,118,111,105,100,96,92,88,85,82,80,78,77,76,74,74,74,74,74,75,76,78,80,82,85,88,92,95,100,106,113,120,129,120,113,107,102,97,93,89,86,84,81,80,78,77,76,75,75,75,76,77,78,79,81,83,86,89,93,97,102,108,114,123,133,122,115,109,103,99,95,91,88,85,83,81,80,78,77,77,77,77,77,78,79,81,82,85,88,91,94,99,103,109,116,126,137,125,117,111,105,100,96,93,90,87,85,83,81,80,79,78,78,78,79,79,81,82,84,87,89,93,96,101,105,111,118,129,143,128,120,113,107,102,98,94,91,88,86,84,83,82,81,80,80,80,80,81,82,84,86,88,91,94,98,103,108,113,121,135,150,131,123,116,110,105,100,96,93,90,88,86,84,83,82,82,82,82,82,83,84,86,88,90,93,96,100,105,110,116,125,142,161,134,125,118,112,107,102,98,95,92,90,88,86,85,84,83,83,83,84,85,86,88,90,92,95,99,103,107,112,118,128,145,171};

// CALIBRATION_SHADING_LS_D65_B
static uint8_t _calibration_shading_ls_d65_b[] = {120,113,107,102,97,93,89,87,84,83,81,79,78,77,76,76,76,77,78,79,80,82,84,87,90,93,97,102,107,113,121,130,118,111,105,100,96,92,88,85,83,81,80,78,77,76,75,75,75,76,76,77,79,81,83,86,88,92,96,100,105,111,119,127,116,109,103,98,94,90,87,84,82,80,78,77,75,74,74,74,74,74,75,76,78,79,82,84,87,90,94,98,103,110,117,125,114,108,102,97,93,89,86,83,80,78,77,75,74,73,73,72,72,73,74,75,76,78,80,83,86,89,93,97,102,108,115,122,113,106,101,96,92,88,85,82,79,77,75,74,73,72,71,71,71,72,73,74,75,77,79,82,84,88,91,95,101,106,113,121,111,105,100,95,91,87,84,81,78,76,74,73,72,71,70,70,70,71,72,73,74,76,78,81,83,87,90,94,99,105,111,119,110,104,99,94,90,86,83,80,77,75,73,72,71,70,69,69,69,70,71,72,73,75,77,80,82,86,89,93,98,104,110,118,109,103,98,93,89,85,82,79,76,74,73,71,70,69,68,68,68,69,70,71,72,74,76,79,82,84,88,92,97,103,109,117,109,103,97,92,88,84,81,78,76,74,72,70,69,68,67,67,67,68,69,70,72,74,76,78,81,84,88,92,96,102,109,116,108,102,96,92,87,84,80,78,75,73,71,70,68,67,67,66,67,67,68,70,71,73,75,78,80,83,87,91,95,101,108,115,108,102,96,91,87,83,80,77,75,73,71,69,68,67,66,66,66,66,68,69,71,73,75,77,80,83,87,90,95,101,107,114,107,101,95,91,87,83,80,77,75,73,71,69,67,66,65,65,65,66,67,69,70,72,74,77,79,82,86,90,95,100,106,114,107,101,95,91,87,83,80,77,74,72,70,69,67,65,65,64,64,66,67,69,70,72,74,77,79,82,86,90,94,100,106,114,106,101,95,90,86,83,79,77,74,72,70,68,67,65,64,64,64,65,67,69,70,72,74,76,79,82,86,90,94,100,106,114,106,100,95,90,86,83,80,77,74,72,70,68,67,65,64,64,64,65,67,68,70,72,74,76,79,82,86,90,94,100,106,114,106,100,95,90,86,83,79,77,74,72,70,69,67,65,64,64,65,65,67,69,70,72,74,77,79,82,86,90,94,100,106,113,106,101,95,91,87,83,80,77,75,72,71,69,67,66,65,65,65,66,67,69,70,72,74,77,80,83,86,90,95,101,107,114,106,101,96,91,87,83,80,77,75,73,71,69,68,66,65,65,66,66,68,69,71,73,75,77,80,83,86,91,95,102,107,114,107,101,96,92,87,83,81,78,75,73,71,70,68,67,66,66,66,67,68,70,71,73,75,78,80,83,87,91,96,102,108,115,108,102,97,92,88,84,81,78,76,74,72,70,69,68,67,67,67,68,69,70,72,74,75,78,81,84,88,92,97,102,109,118,109,103,97,93,88,85,82,79,76,74,73,71,70,69,68,68,68,68,69,71,72,74,76,79,82,85,89,93,97,103,112,121,109,103,98,93,89,86,83,80,77,75,74,72,71,70,69,69,69,69,70,71,73,75,77,79,82,86,89,94,99,104,114,125,111,105,99,94,90,87,84,81,78,76,74,73,72,71,70,70,70,70,71,72,74,76,78,81,83,87,90,95,100,106,115,125,112,106,100,96,91,88,84,82,79,77,75,74,73,72,71,71,71,72,72,74,75,77,79,82,84,88,92,96,102,107,114,123,114,107,102,97,93,89,86,83,80,78,76,75,74,73,72,72,72,73,74,75,76,78,80,83,85,89,93,97,103,109,115,123,116,109,103,98,94,90,87,84,81,79,77,76,75,74,74,73,73,74,75,76,77,79,81,84,87,90,94,98,104,110,117,125,117,111,104,100,96,91,88,85,83,80,79,77,76,75,75,75,75,75,76,77,79,80,82,85,88,91,96,100,106,111,119,128,119,112,106,101,97,93,90,87,84,82,80,79,78,77,76,76,76,76,77,79,80,82,84,87,90,93,97,101,107,113,122,132,121,114,108,103,99,95,91,88,86,83,81,80,79,78,78,77,78,78,79,80,82,83,86,88,91,95,99,103,108,115,125,137,123,116,110,105,100,96,93,90,87,85,83,82,81,80,79,79,79,80,81,82,83,85,87,90,93,97,101,105,111,118,130,143,126,119,113,107,102,98,95,92,89,87,85,83,82,81,81,81,81,81,82,83,85,87,89,92,95,99,103,108,114,121,136,153,129,122,115,109,104,100,96,93,91,88,87,85,84,83,83,82,82,83,84,85,87,89,91,94,97,101,106,110,116,124,139,161};

// R G B
static uint16_t _calibration_awb_warming_ls_a[] = {256, 256, 256};

// R G B
static uint16_t _calibration_awb_warming_ls_d75[] = {256, 256, 256};

// R G B
static uint16_t _calibration_awb_warming_ls_d50[] = {256, 256, 256};

// CALIBRATION_NOISE_PROFILE
static uint8_t _calibration_noise_profile[] = {0, 0, 0, 0, 0, 0, 0, 1, 18, 28, 33, 36, 39, 41, 43, 44, 46, 47, 48, 49, 50, 50, 52, 52, 53, 54, 54, 55, 55, 56, 57, 57, 57, 58, 58, 59, 59, 60, 60, 60, 61, 61, 61, 62, 62, 62, 63, 63, 63, 63, 64, 64, 64, 64, 65, 65, 65, 65, 66, 66, 66, 66, 67, 67, 67, 67, 67, 68, 68, 68, 68, 68, 68, 69, 69, 69, 69, 69, 69, 70, 70, 70, 70, 70, 70, 71, 71, 71, 71, 71, 71, 71, 72, 72, 72, 72, 72, 72, 72, 72, 73, 73, 73, 73, 73, 73, 73, 73, 74, 74, 74, 74, 74, 74, 74, 74, 74, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 76};

// CALIBRATION_DEMOSAIC
static uint8_t _calibration_demosaic[] = {1, 18, 28, 33, 36, 39, 41, 43, 44, 46, 47, 48, 49, 50, 50, 52, 52, 53, 54, 54, 55, 55, 56, 57, 57, 57, 58, 58, 59, 59, 60, 60, 60, 61, 61, 61, 62, 62, 62, 63, 63, 63, 63, 64, 64, 64, 64, 65, 65, 65, 65, 66, 66, 66, 66, 67, 67, 67, 67, 67, 68, 68, 68, 68, 68, 68, 69, 69, 69, 69, 69, 69, 70, 70, 70, 70, 70, 70, 71, 71, 71, 71, 71, 71, 71, 72, 72, 72, 72, 72, 72, 72, 72, 73, 73, 73, 73, 73, 73, 73, 73, 74, 74, 74, 74, 74, 74, 74, 74, 74, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 76, 76, 76, 76, 76, 76, 76, 76};

// 8-bit normalised noise profile for WDR stitching
static uint8_t _calibration_wdr_np_lut[] = {21,31,38,44,50,55,59,63,67,71,74,78,81,84,87,90,93,95,98,101,103,105,108,110,112,115,117,119,121,123,125,127,129,131,133,135,137,139,141,142,144,146,148,149,151,153,154,156,158,159,161,162,164,165,167,169,170,172,173,174,176,177,179,180,182,183,184,186,187,188,190,191,192,194,195,196,198,199,200,202,203,204,205,206,208,209,210,211,213,214,215,216,217,218,220,221,222,223,224,225,226,228,229,230,231,232,233,234,235,236,237,238,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255};

// CALIBRATION_GAMMA
static uint16_t _calibration_gamma[] = {0, 186, 341, 457, 559, 652, 736, 815, 890, 960, 1028, 1093, 1154, 1214, 1272, 1327, 1381, 1434, 1485, 1534, 1583, 1630, 1676, 1721, 1765, 1808, 1850, 1891, 1930, 1970, 2008, 2047, 2084, 2120, 2156, 2191, 2226, 2260, 2293, 2325, 2358, 2389, 2421, 2451, 2481, 2511, 2541, 2569, 2597, 2625, 2652, 2679, 2705, 2732, 2757, 2784, 2808, 2833, 2858, 2881, 2905, 2928, 2951, 2973, 2996, 3018, 3039, 3061, 3081, 3103, 3124, 3144, 3164, 3185, 3204, 3225, 3244, 3264, 3283, 3302, 3321, 3340, 3359, 3377, 3396, 3414, 3432, 3450, 3468, 3485, 3504, 3521, 3538, 3555, 3573, 3590, 3606, 3623, 3639, 3656, 3672, 3689, 3705, 3721, 3737, 3753, 3769, 3785, 3800, 3816, 3831, 3846, 3862, 3877, 3892, 3907, 3922, 3937, 3951, 3966, 3981, 3995, 4010, 4024, 4039, 4053, 4067, 4081, 4095};

// CALIBRATION_IRIDIX_ASYMMETRY
static uint32_t _calibration_iridix_asymmetry[] = {0,62836,120267,172961,221481,266305,307839,346432,382386,415964,447392,476871,504577,530666,555274,578524,600526,621378,641167,659973,677867,694914,711172,726696,741534,755730,769325,782356,794859,806864,818400,829495,840173,850457,860369,869929,879155,888064,896672,904994,913045,920837,928383,935693,942780,949653,956321,962794,969080,975187,981123,986894,992508,997970,1003288,1008466,1013509,1018424,1023215,1027887,1032443,1036889,1041228,1045464,1048575};

static uint32_t _calibration_ca_filter_mem[] = {32768,229629,491259,4278943225,4279204855,4262689525,4246239220,4229788915,4213338610,4196888050,4197214450,4180763890,4164313330,4147928050,4131477235,4115091955,4098641140,4082190325,4082516470,4066065655,4066391800,4066652665,4066913530,4067239930,4067500795,4084473340,4101445885,4118418430,4152037375,4185721855,4219340544,4253025024};

// calibration_awb_scene_presets in the following order AWB_DAY_LIGHT AWB_CLOUDY AWB_INCANDESCENT AWB_FLOURESCENT AWB_TWILIGHT AWB_SHADE AWB_WARM_FLOURESCENT
static uint16_t _calibration_awb_scene_presets[7][2] = {
  { 256, 256 },
  { 306, 204 },
  { 176, 431 },
  { 199, 338 },
  { 199, 338 },
  { 306, 204 },
  { 176, 431 }
};

// CALIBRATION_CA_CORRECTION: MIN_CORRECTION, MESH_WIDTH, MESH_HEIGHT
static uint16_t _calibration_ca_correction[] = {1, 64, 64};

static uint16_t _calibration_ca_correction_mem[][10] = {
  { 65532, 10, 65533, 11, 1, 65530, 65522, 7, 6, 65527 },
  { 65533, 4, 2, 65530, 3, 65531, 9, 65535, 0, 65534 },
  { 12, 65532, 65533, 65521, 65520, 5, 23, 63, 65526, 65414 },
  { 65533, 3, 3, 65534, 4, 65530, 2, 65535, 32, 65468 }};

static uint32_t _calibration_lut3d_mem[] = {0};

static uint32_t _calibration_decompander0_mem[] = {0, 32768, 65536, 98304, 131072, 163840, 196608, 229376, 262144, 294912, 327680, 360448, 393216, 425984, 458752, 491520, 524288, 557055, 589823, 622591, 655359, 688127, 720895, 753663, 786431, 819199, 851967, 884735, 917503, 950271, 983039, 1015807, 1048575};

static uint32_t _calibration_decompander1_mem[] = {0, 4096, 8192, 12288, 16384, 20480, 24576, 28672, 32768, 36864, 40960, 45056, 49152, 53248, 57344, 61440, 65536, 69632, 73728, 77824, 81920, 86016, 90112, 94208, 98304, 102400, 106496, 110592, 114688, 118784, 122880, 126976, 131072, 135168, 139264, 143360, 147456, 151552, 155648, 159744, 163840, 167936, 172032, 176128, 180224, 184320, 188416, 192512, 196608, 200704, 204800, 208896, 212992, 217088, 221184, 225280, 229376, 233472, 237568, 241664, 245760, 249856, 253952, 258048, 262144, 266240, 270336, 274432, 278528, 282624, 286720, 290816, 294912, 299008, 303104, 307200, 311296, 315392, 319488, 323584, 327680, 331776, 335872, 339968, 344064, 348160, 352256, 356352, 360448, 364544, 368640, 372736, 376832, 380928, 385024, 389120, 393216, 397312, 401408, 405504, 409600, 413696, 417792, 421888, 425984, 430080, 434176, 438272, 442368, 446464, 450560, 454656, 458752, 462848, 466944, 471040, 475136, 479232, 483328, 487424, 491520, 495616, 499712, 503808, 507904, 512000, 516096, 520192, 524288, 528383, 532479, 536575, 540671, 544767, 548863, 552959, 557055, 561151, 565247, 569343, 573439, 577535, 581631, 585727, 589823, 593919, 598015, 602111, 606207, 610303, 614399, 618495, 622591, 626687, 630783, 634879, 638975, 643071, 647167, 651263, 655359, 659455, 663551, 667647, 671743, 675839, 679935, 684031, 688127, 692223, 696319, 700415, 704511, 708607, 712703, 716799, 720895, 724991, 729087, 733183, 737279, 741375, 745471, 749567, 753663, 757759, 761855, 765951, 770047, 774143, 778239, 782335, 786431, 790527, 794623, 798719, 802815, 806911, 811007, 815103, 819199, 823295, 827391, 831487, 835583, 839679, 843775, 847871, 851967, 856063, 860159, 864255, 868351, 872447, 876543, 880639, 884735, 888831, 892927, 897023, 901119, 905215, 909311, 913407, 917503, 921599, 925695, 929791, 933887, 937983, 942079, 946175, 950271, 954367, 958463, 962559, 966655, 970751, 974847, 978943, 983039, 987135, 991231, 995327, 999423, 1003519, 1007615, 1011711, 1015807, 1019903, 1023999, 1028095, 1032191, 1036287, 1040383, 1044479, 1048575};

// CALIBRATION_SHADING_RADIAL_R
static uint16_t _calibration_shading_radial_r[] = {4096,4098,4099,4101,4103,4104,4106,4108,4110,4112,4114,4116,4118,4120,4122,4124,4126,4128,4131,4133,4136,4138,4141,4144,4146,4149,4152,4155,4158,4161,4165,4168,4171,4175,4178,4182,4186,4190,4194,4198,4202,4206,4211,4215,4220,4225,4229,4234,4239,4245,4250,4255,4261,4266,4272,4278,4284,4290,4296,4303,4309,4316,4323,4329,4336,4344,4351,4358,4366,4373,4381,4389,4397,4405,4413,4422,4430,4439,4448,4457,4466,4475,4485,4494,4504,4514,4524,4534,4544,4554,4565,4575,4586,4597,4608,4619,4630,4642,4653,4665,4677,4688,4700,4713,4725,4737,4750,4762,4775,4788,4800,4813,4826,4840,4853,4866,4880,4893,4907,4920,4934,4948,4962,4976,4990,5004,5018,5032,5046};

// CALIBRATION_SHADING_RADIAL_G
static uint16_t _calibration_shading_radial_g[] = {4096,4098,4099,4100,4102,4103,4105,4106,4108,4109,4111,4112,4114,4115,4117,4119,4120,4122,4124,4125,4127,4129,4131,4133,4135,4137,4140,4142,4144,4147,4149,4152,4155,4158,4161,4164,4167,4170,4173,4177,4180,4184,4188,4192,4196,4200,4204,4208,4213,4217,4222,4227,4232,4237,4242,4248,4253,4259,4265,4271,4277,4283,4290,4296,4303,4310,4317,4324,4332,4339,4347,4355,4363,4371,4379,4387,4396,4405,4414,4423,4432,4441,4451,4460,4470,4480,4490,4501,4511,4522,4533,4544,4555,4566,4577,4589,4601,4612,4624,4636,4649,4661,4673,4686,4699,4712,4725,4738,4751,4764,4778,4791,4805,4819,4832,4846,4860,4874,4888,4902,4916,4930,4945,4959,4973,4987,5001,5016,5030};

// CALIBRATION_SHADING_RADIAL_B
static uint16_t _calibration_shading_radial_b[] = {4096,4097,4098,4099,4100,4101,4101,4102,4103,4104,4105,4106,4107,4108,4108,4109,4110,4111,4113,4114,4115,4116,4117,4119,4120,4122,4123,4125,4127,4128,4130,4132,4134,4136,4139,4141,4143,4146,4148,4151,4154,4157,4160,4163,4166,4170,4173,4177,4181,4185,4189,4193,4197,4202,4206,4211,4216,4221,4226,4231,4237,4242,4248,4254,4260,4266,4272,4279,4286,4292,4299,4306,4314,4321,4328,4336,4344,4352,4360,4368,4377,4386,4394,4403,4412,4422,4431,4440,4450,4460,4470,4480,4490,4501,4511,4522,4533,4544,4555,4566,4577,4589,4600,4612,4624,4636,4648,4660,4672,4684,4697,4709,4722,4734,4747,4760,4773,4786,4798,4811,4824,4837,4850,4863,4876,4889,4902,4915,4928};

static LookupTable calibration_shading_radial_r = { .ptr = _calibration_shading_radial_r, .rows = 1, .cols = sizeof(_calibration_shading_radial_r) / sizeof(_calibration_shading_radial_r[0]), .width = sizeof(_calibration_shading_radial_r[0] ) };
static LookupTable calibration_shading_radial_g = { .ptr = _calibration_shading_radial_g, .rows = 1, .cols = sizeof(_calibration_shading_radial_g) / sizeof(_calibration_shading_radial_g[0]), .width = sizeof(_calibration_shading_radial_g[0] ) };
static LookupTable calibration_shading_radial_b = { .ptr = _calibration_shading_radial_b, .rows = 1, .cols = sizeof(_calibration_shading_radial_b) / sizeof(_calibration_shading_radial_b[0]), .width = sizeof(_calibration_shading_radial_b[0] ) };
static LookupTable calibration_decompander0_mem = {.ptr = _calibration_decompander0_mem, .rows = 1, .cols = sizeof( _calibration_decompander0_mem ) / sizeof( _calibration_decompander0_mem[0] ), .width = sizeof( _calibration_decompander0_mem[0] )};
static LookupTable calibration_decompander1_mem = {.ptr = _calibration_decompander1_mem, .rows = 1, .cols = sizeof( _calibration_decompander1_mem ) / sizeof( _calibration_decompander1_mem[0] ), .width = sizeof( _calibration_decompander1_mem[0] )};

static LookupTable calibration_awb_scene_presets = {.ptr = _calibration_awb_scene_presets, .cols = 2, .rows = sizeof( _calibration_awb_scene_presets ) / sizeof( _calibration_awb_scene_presets[0] ), .width = sizeof( _calibration_awb_scene_presets[0][0] )};
static LookupTable calibration_light_src = {.ptr = _calibration_light_src, .cols = 2, .rows = sizeof( _calibration_light_src ) / sizeof( _calibration_light_src[0] ), .width = sizeof( _calibration_light_src[0][0] )};
static LookupTable calibration_rg_pos = {.ptr = _calibration_rg_pos, .rows = 1, .cols = sizeof( _calibration_rg_pos ) / sizeof( _calibration_rg_pos[0] ), .width = sizeof( _calibration_rg_pos[0] )};
static LookupTable calibration_bg_pos = {.ptr = _calibration_bg_pos, .rows = 1, .cols = sizeof( _calibration_bg_pos ) / sizeof( _calibration_bg_pos[0] ), .width = sizeof( _calibration_bg_pos[0] )};
static LookupTable calibration_mesh_rgbg_weight = {.ptr = _calibration_mesh_rgbg_weight, .cols = 15, .rows = sizeof( _calibration_mesh_rgbg_weight ) / sizeof( _calibration_mesh_rgbg_weight[0] ), .width = sizeof( _calibration_mesh_rgbg_weight[0][0] )};
static LookupTable calibration_mesh_ls_weight = {.ptr = _calibration_mesh_ls_weight, .cols = 15, .rows = sizeof( _calibration_mesh_ls_weight ) / sizeof( _calibration_mesh_ls_weight[0] ), .width = sizeof( _calibration_mesh_ls_weight[0][0] )};
static LookupTable calibration_mesh_color_temperature = {.ptr = _calibration_mesh_color_temperature, .cols = 15, .rows = sizeof( _calibration_mesh_color_temperature ) / sizeof( _calibration_mesh_color_temperature[0] ), .width = sizeof( _calibration_mesh_color_temperature[0][0] )};
static LookupTable calibration_wb_strength = {.ptr = _calibration_wb_strength, .rows = 1, .cols = sizeof( _calibration_wb_strength ) / sizeof( _calibration_wb_strength[0] ), .width = sizeof( _calibration_wb_strength[0] )};
static LookupTable calibration_sky_lux_th = {.ptr = _calibration_sky_lux_th, .rows = 1, .cols = sizeof( _calibration_sky_lux_th ) / sizeof( _calibration_sky_lux_th[0] ), .width = sizeof( _calibration_sky_lux_th[0] )};
static LookupTable calibration_ct_rg_pos_calc = {.ptr = _calibration_ct_rg_pos_calc, .rows = 1, .cols = sizeof( _calibration_ct_rg_pos_calc ) / sizeof( _calibration_ct_rg_pos_calc[0] ), .width = sizeof( _calibration_ct_rg_pos_calc[0] )};
static LookupTable calibration_ct_bg_pos_calc = {.ptr = _calibration_ct_bg_pos_calc, .rows = 1, .cols = sizeof( _calibration_ct_bg_pos_calc ) / sizeof( _calibration_ct_bg_pos_calc[0] ), .width = sizeof( _calibration_ct_bg_pos_calc[0] )};
static LookupTable calibration_color_temp = {.ptr = _calibration_color_temp, .rows = 1, .cols = sizeof( _calibration_color_temp ) / sizeof( _calibration_color_temp[0] ), .width = sizeof( _calibration_color_temp[0] )};
static LookupTable calibration_ct65pos = {.ptr = _calibration_ct65pos, .rows = 1, .cols = sizeof( _calibration_ct65pos ) / sizeof( _calibration_ct65pos[0] ), .width = sizeof( _calibration_ct65pos[0] )};
static LookupTable calibration_ct40pos = {.ptr = _calibration_ct40pos, .rows = 1, .cols = sizeof( _calibration_ct40pos ) / sizeof( _calibration_ct40pos[0] ), .width = sizeof( _calibration_ct40pos[0] )};
static LookupTable calibration_ct30pos = {.ptr = _calibration_ct30pos, .rows = 1, .cols = sizeof( _calibration_ct30pos ) / sizeof( _calibration_ct30pos[0] ), .width = sizeof( _calibration_ct30pos[0] )};
static LookupTable calibration_evtolux_ev_lut = {.ptr = _calibration_evtolux_ev_lut, .rows = 1, .cols = sizeof( _calibration_evtolux_ev_lut ) / sizeof( _calibration_evtolux_ev_lut[0] ), .width = sizeof( _calibration_evtolux_ev_lut[0] )};
static LookupTable calibration_evtolux_lux_lut = {.ptr = _calibration_evtolux_lux_lut, .rows = 1, .cols = sizeof( _calibration_evtolux_lux_lut ) / sizeof( _calibration_evtolux_lux_lut[0] ), .width = sizeof( _calibration_evtolux_lux_lut[0] )};
static LookupTable calibration_black_level_r = {.ptr = _calibration_black_level_r, .cols = 2, .rows = sizeof( _calibration_black_level_r ) / sizeof( _calibration_black_level_r[0] ), .width = sizeof( _calibration_black_level_r[0][0] )};
static LookupTable calibration_black_level_gr = {.ptr = _calibration_black_level_gr, .cols = 2, .rows = sizeof( _calibration_black_level_gr ) / sizeof( _calibration_black_level_gr[0] ), .width = sizeof( _calibration_black_level_gr[0][0] )};
static LookupTable calibration_black_level_gb = {.ptr = _calibration_black_level_gb, .cols = 2, .rows = sizeof( _calibration_black_level_gb ) / sizeof( _calibration_black_level_gb[0] ), .width = sizeof( _calibration_black_level_gb[0][0] )};
static LookupTable calibration_black_level_b = {.ptr = _calibration_black_level_b, .cols = 2, .rows = sizeof( _calibration_black_level_b ) / sizeof( _calibration_black_level_b[0] ), .width = sizeof( _calibration_black_level_b[0][0] )};
static LookupTable calibration_static_wb = {.ptr = _calibration_static_wb, .rows = 1, .cols = sizeof( _calibration_static_wb ) / sizeof( _calibration_static_wb[0] ), .width = sizeof( _calibration_static_wb[0] )};
static LookupTable calibration_mt_absolute_ls_a_ccm = {.ptr = _calibration_mt_absolute_ls_a_ccm, .rows = 1, .cols = sizeof( _calibration_mt_absolute_ls_a_ccm ) / sizeof( _calibration_mt_absolute_ls_a_ccm[0] ), .width = sizeof( _calibration_mt_absolute_ls_a_ccm[0] )};
static LookupTable calibration_mt_absolute_ls_d40_ccm = {.ptr = _calibration_mt_absolute_ls_d40_ccm, .rows = 1, .cols = sizeof( _calibration_mt_absolute_ls_d40_ccm ) / sizeof( _calibration_mt_absolute_ls_d40_ccm[0] ), .width = sizeof( _calibration_mt_absolute_ls_d40_ccm[0] )};
static LookupTable calibration_mt_absolute_ls_d50_ccm = {.ptr = _calibration_mt_absolute_ls_d50_ccm, .rows = 1, .cols = sizeof( _calibration_mt_absolute_ls_d50_ccm ) / sizeof( _calibration_mt_absolute_ls_d50_ccm[0] ), .width = sizeof( _calibration_mt_absolute_ls_d50_ccm[0] )};
static LookupTable calibration_shading_ls_a_r = {.ptr = _calibration_shading_ls_a_r, .rows = 1, .cols = sizeof( _calibration_shading_ls_a_r ) / sizeof( _calibration_shading_ls_a_r[0] ), .width = sizeof( _calibration_shading_ls_a_r[0] )};
static LookupTable calibration_shading_ls_a_g = {.ptr = _calibration_shading_ls_a_g, .rows = 1, .cols = sizeof( _calibration_shading_ls_a_g ) / sizeof( _calibration_shading_ls_a_g[0] ), .width = sizeof( _calibration_shading_ls_a_g[0] )};
static LookupTable calibration_shading_ls_a_b = {.ptr = _calibration_shading_ls_a_b, .rows = 1, .cols = sizeof( _calibration_shading_ls_a_b ) / sizeof( _calibration_shading_ls_a_b[0] ), .width = sizeof( _calibration_shading_ls_a_b[0] )};
static LookupTable calibration_shading_ls_tl84_r = {.ptr = _calibration_shading_ls_tl84_r, .rows = 1, .cols = sizeof( _calibration_shading_ls_tl84_r ) / sizeof( _calibration_shading_ls_tl84_r[0] ), .width = sizeof( _calibration_shading_ls_tl84_r[0] )};
static LookupTable calibration_shading_ls_tl84_g = {.ptr = _calibration_shading_ls_tl84_g, .rows = 1, .cols = sizeof( _calibration_shading_ls_tl84_g ) / sizeof( _calibration_shading_ls_tl84_g[0] ), .width = sizeof( _calibration_shading_ls_tl84_g[0] )};
static LookupTable calibration_shading_ls_tl84_b = {.ptr = _calibration_shading_ls_tl84_b, .rows = 1, .cols = sizeof( _calibration_shading_ls_tl84_b ) / sizeof( _calibration_shading_ls_tl84_b[0] ), .width = sizeof( _calibration_shading_ls_tl84_b[0] )};
static LookupTable calibration_shading_ls_d65_r = {.ptr = _calibration_shading_ls_d65_r, .rows = 1, .cols = sizeof( _calibration_shading_ls_d65_r ) / sizeof( _calibration_shading_ls_d65_r[0] ), .width = sizeof( _calibration_shading_ls_d65_r[0] )};
static LookupTable calibration_shading_ls_d65_g = {.ptr = _calibration_shading_ls_d65_g, .rows = 1, .cols = sizeof( _calibration_shading_ls_d65_g ) / sizeof( _calibration_shading_ls_d65_g[0] ), .width = sizeof( _calibration_shading_ls_d65_g[0] )};
static LookupTable calibration_shading_ls_d65_b = {.ptr = _calibration_shading_ls_d65_b, .rows = 1, .cols = sizeof( _calibration_shading_ls_d65_b ) / sizeof( _calibration_shading_ls_d65_b[0] ), .width = sizeof( _calibration_shading_ls_d65_b[0] )};
static LookupTable calibration_awb_warming_ls_a = {.ptr = _calibration_awb_warming_ls_a, .rows = 1, .cols = sizeof( _calibration_awb_warming_ls_a ) / sizeof( _calibration_awb_warming_ls_a[0] ), .width = sizeof( _calibration_awb_warming_ls_a[0] )};
static LookupTable calibration_awb_warming_ls_d50 = {.ptr = _calibration_awb_warming_ls_d50, .rows = 1, .cols = sizeof( _calibration_awb_warming_ls_d50 ) / sizeof( _calibration_awb_warming_ls_d50[0] ), .width = sizeof( _calibration_awb_warming_ls_d50[0] )};
static LookupTable calibration_awb_warming_ls_d75 = {.ptr = _calibration_awb_warming_ls_d75, .rows = 1, .cols = sizeof( _calibration_awb_warming_ls_d75 ) / sizeof( _calibration_awb_warming_ls_d75[0] ), .width = sizeof( _calibration_awb_warming_ls_d75[0] )};
static LookupTable calibration_noise_profile = {.ptr = _calibration_noise_profile, .rows = 1, .cols = sizeof( _calibration_noise_profile ) / sizeof( _calibration_noise_profile[0] ), .width = sizeof( _calibration_noise_profile[0] )};
static LookupTable calibration_demosaic = {.ptr = _calibration_demosaic, .rows = 1, .cols = sizeof( _calibration_demosaic ) / sizeof( _calibration_demosaic[0] ), .width = sizeof( _calibration_demosaic[0] )};
static LookupTable calibration_wdr_np_lut = {.ptr = _calibration_wdr_np_lut, .rows = 1, .cols = sizeof( _calibration_wdr_np_lut ) / sizeof( _calibration_wdr_np_lut[0] ), .width = sizeof( _calibration_wdr_np_lut[0] )};
static LookupTable calibration_gamma = {.ptr = _calibration_gamma, .rows = 1, .cols = sizeof( _calibration_gamma ) / sizeof( _calibration_gamma[0] ), .width = sizeof( _calibration_gamma[0] )};
static LookupTable calibration_iridix_asymmetry = {.ptr = _calibration_iridix_asymmetry, .rows = 1, .cols = sizeof( _calibration_iridix_asymmetry ) / sizeof( _calibration_iridix_asymmetry[0] ), .width = sizeof( _calibration_iridix_asymmetry[0] )};
static LookupTable calibration_ca_filter_mem = {.ptr = _calibration_ca_filter_mem, .rows = 1, .cols = sizeof( _calibration_ca_filter_mem ) / sizeof( _calibration_ca_filter_mem[0] ), .width = sizeof( _calibration_ca_filter_mem[0] )};
static LookupTable calibration_ca_correction = {.ptr = _calibration_ca_correction, .rows = 1, .cols = sizeof( _calibration_ca_correction ) / sizeof( _calibration_ca_correction[0] ), .width = sizeof( _calibration_ca_correction[0] )};
static LookupTable calibration_ca_correction_mem = {.ptr = _calibration_ca_correction_mem, .cols = 10, .rows = sizeof( _calibration_ca_correction_mem ) / sizeof( _calibration_ca_correction_mem[0] ), .width = sizeof( _calibration_ca_correction_mem[0][0] )};
static LookupTable calibration_lut3d_mem = {.ptr = _calibration_lut3d_mem, .rows = 1, .cols = sizeof( _calibration_lut3d_mem ) / sizeof( _calibration_lut3d_mem[0] ), .width = sizeof( _calibration_lut3d_mem[0] )};

uint32_t get_calibrations_static_fs_lin_ov5647_lens_8mm( ACameraCalibrations *c )
{
    uint32_t result = 0;
    if ( c != 0 ) {
        c->calibrations[CALIBRATION_SHADING_RADIAL_R] = &calibration_shading_radial_r;
        c->calibrations[CALIBRATION_SHADING_RADIAL_G] = &calibration_shading_radial_g;
        c->calibrations[CALIBRATION_SHADING_RADIAL_B] = &calibration_shading_radial_b;
        c->calibrations[CALIBRATION_DECOMPANDER0_MEM] = &calibration_decompander0_mem;
        c->calibrations[CALIBRATION_DECOMPANDER1_MEM] = &calibration_decompander1_mem;
        c->calibrations[CALIBRATION_LIGHT_SRC] = &calibration_light_src;
        c->calibrations[CALIBRATION_RG_POS] = &calibration_rg_pos;
        c->calibrations[CALIBRATION_BG_POS] = &calibration_bg_pos;
        c->calibrations[CALIBRATION_MESH_RGBG_WEIGHT] = &calibration_mesh_rgbg_weight;
        c->calibrations[CALIBRATION_MESH_LS_WEIGHT] = &calibration_mesh_ls_weight;
        c->calibrations[CALIBRATION_MESH_COLOR_TEMPERATURE] = &calibration_mesh_color_temperature;
        c->calibrations[CALIBRATION_WB_STRENGTH] = &calibration_wb_strength;
        c->calibrations[CALIBRATION_SKY_LUX_TH] = &calibration_sky_lux_th;
        c->calibrations[CALIBRATION_CT_RG_POS_CALC] = &calibration_ct_rg_pos_calc;
        c->calibrations[CALIBRATION_CT_BG_POS_CALC] = &calibration_ct_bg_pos_calc;
        c->calibrations[CALIBRATION_COLOR_TEMP] = &calibration_color_temp;
        c->calibrations[CALIBRATION_CT65POS] = &calibration_ct65pos;
        c->calibrations[CALIBRATION_CT40POS] = &calibration_ct40pos;
        c->calibrations[CALIBRATION_CT30POS] = &calibration_ct30pos;
        c->calibrations[CALIBRATION_EVTOLUX_EV_LUT] = &calibration_evtolux_ev_lut;
        c->calibrations[CALIBRATION_EVTOLUX_LUX_LUT] = &calibration_evtolux_lux_lut;
        c->calibrations[CALIBRATION_BLACK_LEVEL_R] = &calibration_black_level_r;
        c->calibrations[CALIBRATION_BLACK_LEVEL_GR] = &calibration_black_level_gr;
        c->calibrations[CALIBRATION_BLACK_LEVEL_GB] = &calibration_black_level_gb;
        c->calibrations[CALIBRATION_BLACK_LEVEL_B] = &calibration_black_level_b;
        c->calibrations[CALIBRATION_STATIC_WB] = &calibration_static_wb;
        c->calibrations[CALIBRATION_MT_ABSOLUTE_LS_A_CCM] = &calibration_mt_absolute_ls_a_ccm;
        c->calibrations[CALIBRATION_MT_ABSOLUTE_LS_D40_CCM] = &calibration_mt_absolute_ls_d40_ccm;
        c->calibrations[CALIBRATION_MT_ABSOLUTE_LS_D50_CCM] = &calibration_mt_absolute_ls_d50_ccm;
        c->calibrations[CALIBRATION_SHADING_LS_A_R] = &calibration_shading_ls_a_r;
        c->calibrations[CALIBRATION_SHADING_LS_A_G] = &calibration_shading_ls_a_g;
        c->calibrations[CALIBRATION_SHADING_LS_A_B] = &calibration_shading_ls_a_b;
        c->calibrations[CALIBRATION_SHADING_LS_TL84_R] = &calibration_shading_ls_tl84_r;
        c->calibrations[CALIBRATION_SHADING_LS_TL84_G] = &calibration_shading_ls_tl84_g;
        c->calibrations[CALIBRATION_SHADING_LS_TL84_B] = &calibration_shading_ls_tl84_b;
        c->calibrations[CALIBRATION_SHADING_LS_D65_R] = &calibration_shading_ls_d65_r;
        c->calibrations[CALIBRATION_SHADING_LS_D65_G] = &calibration_shading_ls_d65_g;
        c->calibrations[CALIBRATION_SHADING_LS_D65_B] = &calibration_shading_ls_d65_b;
        c->calibrations[CALIBRATION_AWB_WARMING_LS_A] = &calibration_awb_warming_ls_a;
        c->calibrations[CALIBRATION_AWB_WARMING_LS_D50] = &calibration_awb_warming_ls_d50;
        c->calibrations[CALIBRATION_AWB_WARMING_LS_D75] = &calibration_awb_warming_ls_d75;
        c->calibrations[CALIBRATION_NOISE_PROFILE] = &calibration_noise_profile;
        c->calibrations[CALIBRATION_DEMOSAIC] = &calibration_demosaic;
        c->calibrations[CALIBRATION_WDR_NP_LUT] = &calibration_wdr_np_lut;
        c->calibrations[CALIBRATION_GAMMA] = &calibration_gamma;
        c->calibrations[CALIBRATION_IRIDIX_ASYMMETRY] = &calibration_iridix_asymmetry;
        c->calibrations[CALIBRATION_AWB_SCENE_PRESETS] = &calibration_awb_scene_presets;
        c->calibrations[CALIBRATION_CA_FILTER_MEM] = &calibration_ca_filter_mem;
        c->calibrations[CALIBRATION_CA_CORRECTION] = &calibration_ca_correction;
        c->calibrations[CALIBRATION_CA_CORRECTION_MEM] = &calibration_ca_correction_mem;
        c->calibrations[CALIBRATION_LUT3D_MEM] = &calibration_lut3d_mem;
    } else {
        result = -1;
    }
    return result;
}
